home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 051-075 / disk_073 / add / add.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  4KB  |  119 lines

  1. /*
  2.  *  ADD (add keyboard shortcuts to menus)
  3.  *
  4.  *  Copyright ((c)) 1987, John Russell
  5.  *  This program is freely redistributable. Nobody may impose extra
  6.  *  limitations on its distribution.
  7.  *
  8.  *  Please distribute at least documentation with the executable. The
  9.  *  source is straightforward, but could be informative for those who get
  10.  *  blurred vision from reading those structure definitions in intuition.h.
  11.  *
  12.  *  This program is shareware, and if you feel that it is useful to you
  13.  *  (I *know* it is to me :-) a small contribution would be appreciated
  14.  *  (see documentation).
  15.  */
  16.  
  17. /* Manx users compile with "+l" just in case */
  18.  
  19. #include <intuition/intuition.h>
  20. #include <stdio.h>
  21.  
  22. /* include all the standard stuff for _intuition_ */
  23.  
  24. struct IntuitionBase *IntuitionBase;
  25.  
  26. main(argc,argv)
  27. int argc;
  28. char *argv[];
  29. {
  30.     struct Screen *screen;
  31.     struct Window *window;
  32.     struct MenuItem *item;
  33.     struct Menu *menu,*main_menu;
  34.     char answer,*gets();
  35.     int x,cut;
  36.  
  37.     cut = argc-1; /* *argv[cut] == key to assign */
  38.  
  39.     if ((IntuitionBase=(struct IntuitionBase *)
  40.         OpenLibrary("intuition.library",0L))==NULL) {
  41.             puts("Where is Intuition gone???\n");
  42.             exit(0);
  43.     }
  44.  
  45.  
  46.  
  47.     Forbid(); /* the following line was outside the Forbid-Permit loop in the
  48. posted executable, but should be inside */
  49.  
  50.     screen = IntuitionBase->FirstScreen; /* address of Workbench screen 
  51. structure */
  52.  
  53.     while (screen != NULL) {     /* do all screens */
  54.         window = screen->FirstWindow;
  55.         while (window != NULL) {    /* do all windows */
  56.             if (compare(argv[1],window->Title)==0) {  /* search for name */
  57.  
  58.                 x=atoi(argv[2]);  /* menu # */
  59.  
  60.                 menu = window->MenuStrip;
  61.                 main_menu = menu; /* main menu of window for SetMenuStrip */
  62.  
  63.                 while (--x > 0) {  /* scan menu list */
  64.                     if ((menu = menu->NextMenu) == NULL)
  65.                         goto quit;
  66.                 }
  67.  
  68.                 x = atoi(argv[3]);  /* item # */
  69.                 item = menu->FirstItem;
  70. submenu:
  71.                 while (--x > 0) {  /* scan item list */
  72.                     if ((item = item->NextItem) == NULL)
  73.                         goto quit;
  74.                 }
  75.  
  76.                 if (argc==6) { /* descend into sub-menu? */
  77.                     argc=0;
  78.                     item=item->SubItem;
  79.                     x=atoi(argv[4]); /* sub-item # */
  80.                     goto submenu;
  81.                 }
  82.  
  83.                 ClearMenuStrip(window); /* disable menu structure */
  84.  
  85.                 if (!compare(argv[cut],"-kill")) {
  86.                     item->Flags &= -(COMMSEQ+1); /* turn off bit */
  87.                     puts("Deleted shortcut.");
  88.                 }
  89.                 else {
  90.                     item->Flags |= COMMSEQ; /* add shortcut flag */
  91.                     item->Command = *argv[cut];  /* which key */
  92.                     puts("Added shortcut."); /* took out stray newline */
  93.                 }
  94.  
  95.                 SetMenuStrip(window,main_menu); /* give it back */
  96.             }
  97.         window = window->NextWindow;
  98.         }
  99.     screen = screen->NextScreen;
  100.     }
  101.  
  102.     quit:
  103.     Permit();
  104.     CloseLibrary(IntuitionBase);
  105.  
  106. }
  107.  
  108. compare(string1,string2) /* if spaces in windowname, only check first word */
  109. char *string1,*string2;
  110. {
  111.     while ((*string1 != '\0') && (*string1 != ' ')) {
  112.         if (*string1 != *string2) /* space and null both end conditions */
  113.             return(1);
  114.         string1++;
  115.         string2++;
  116.     }
  117.     return(0);  /* return weird values like strcmp() */
  118. }
  119.